#include <iostream>
#include "../comm/httplib.h"
#include "oj_control.hpp"

using namespace httplib;
using namespace ns_control;

static Control *ctrl_ptr = nullptr;

void Recovery(int signo)
{
        ctrl_ptr->RecoveryMachine();
}
int main()
{
        signal(SIGQUIT, Recovery);
        // ⽤⼾请求的服务路由功能
        Server svr;
        Control ctrl;
        ctrl_ptr = &ctrl;

        // 获取所有的题⽬列表
        svr.Get("/all_questions", [&ctrl](const Request &req, Response &resp)
                { 
                string html;
                ctrl.AllQuestions(&html);
                resp.set_content(html,"text/html; charset=utf-8"); });

        // ⽤⼾要根据题⽬编号，获取题⽬的内容
        // /question/100 -> 正则匹配
        // R"()", 原始字符串raw string,保持字符串内容的原貌，不⽤做相关的转义
        svr.Get(R"(/question/(\d+))", [&ctrl](const Request &req, Response &resp)
                {
		std::string number = req.matches[1];
                std::string html;
                ctrl.Questions(number,&html);
		resp.set_content(html, "text/html; charset=utf-8"); });

        // ⽤⼾提交代码，使⽤我们的判题功能(1. 每道题的测试⽤例 2. compile_and_run)
        svr.Post(R"(/judge/(\d+))", [&ctrl](const Request &req, Response &resp)
                 {
                         std::string number = req.matches[1];
                         string result_json;
                         ctrl.Judge(number, req.body, &result_json);
                         resp.set_content(result_json, "application/json; charset=utf-8");
                         // resp.set_content("指定题⽬的判题: " + number, "text/plain; charset=utf-8");
                 });

        svr.set_base_dir("./wwwroot");

        svr.listen("0.0.0.0", 8080);
        return 0;
}
